Tipo di dati: REFERENCE TO
Importante
Con la versione del compilatore >= V3.3.0.0, i riferimenti vengono inizializzati (a 0).
Importante
Se un riferimento fa riferimento a un input del dispositivo, l'accesso viene applicato come accesso in scrittura. Quando il codice viene generato, questo porta all'avviso del compilatore: "...invalid assignment target
".
Esempio: rInput REF= Input;
Se hai bisogno di un costrutto di questo tipo, devi prima copiare il valore di input (esempio: rInput
) a una variabile con accesso in scrittura.
Un riferimento con il REFERENCE
il tipo di dati fa implicitamente riferimento a un altro oggetto. L'incarico viene svolto con il REF=
operatore. Quando si accede, il riferimento viene dereferenziato in modo implicito e pertanto non necessita di un operatore di contenuto speciale ^
come un puntatore.
Sintassi
<identifier> : REFERENCE TO <data type> ; <data type>: base type of the reference
PROGRAM PLC_PRG VAR rspeA : REFERENCE TO DUT_SPECIAL; pspeA : POINTER TO DUT_SPECIAL; speB : DUT_SPECIAL; END_VAR rspeA REF= speB; // Reference rspeA is alias for speB. The code corresponds to pspeA := ADR(speB); rspeA := speD; // The code corresponds to pspeA^ := speD;
ariTest : ARRAY[0..9] OF REFERENCE TO INT; priTest : POINTER TO REFERENCE TO INT; rriTest : REFERENCE TO REFERENCE TO INT; rbitTest : REFERENCE TO BIT;
Un tipo di riferimento non deve essere utilizzato come tipo di base di una matrice, un puntatore o un riferimento. Inoltre, un riferimento non deve fare riferimento a una variabile bit. Questi tipi di costrutti generano errori del compilatore.
Nota
La leggibilità di un programma è resa difficoltosa quando si accede contemporaneamente alla stessa cella di memoria tramite un identificatore ed il suo alias.
Esempio: speB
e rspeA
Suggerimento
Riferimenti e puntatori a BIT
le variabili sono non valido dichiarazioni, nonché elementi di matrice con tipo base BIT
.
Quando vengono assegnati i riferimenti con :=
, un valore viene sempre copiato, indipendentemente dal fatto che il riferimento sia a sinistra, a destra o su entrambi i lati:
Ref := value
scrive il valorevalue
alla posizione a cui punta il riferimento. Nella notazione del puntatore:Ref^ := value
value := Ref
scrive il valore a cui punta il riferimento dopovalue
. Nella notazione del puntatore:value := Ref^
Ref1 := Ref2
scrive il valore whichRef2
punta a. nel luogo in cuiRef1
punta a. Nella notazione del puntatore:Ref1^ := Ref2^
Quando REF=
viene utilizzato, l'indirizzo viene sempre applicato e deve esserci un riferimento sul lato sinistro:
Ref REF= value
: Il riferimento punta avalue
. Nella notazione del puntatore:Ref :=ADR(value)
Ref1 REF= Ref2
:Ref1
punta allo stesso valore diRef2
. Nella notazione del puntatore:Ref1 := Ref2
Value REF = Ref
porta ad un errore di compilazione
Suggerimento
Nella dichiarazione, REFERENCE TO INT REF= value
si comporta come REFERENCE TO INT := value
.
Confronto tra riferimento e puntatore
Più facile da usare:
Un riferimento può accedere al contenuto dell'oggetto referenziato direttamente e senza dereferenziazione.
Sintassi più fine e più semplice durante il passaggio di valori:
Richiamo di un blocco funzione che passa un riferimento senza un operatore di indirizzo invece di un puntatore
Esempio:
fbDoIt(riInput:=iValue);
Invece di:
fbDoIt_1(piInput:=ADR(iValue));
Tipo di sicurezza:
Quando si assegnano due riferimenti, il compilatore controlla se i loro tipi di base corrispondono. Questo non è verificato nel caso dei puntatori.
Verifica della validità di un riferimento
Puoi usare l'operatore __ISVALIDREF
per verificare se un riferimento punta o meno a un valore valido (ovvero un valore diverso da 0).
Sintassi
<boolean variable name> := __ISVALIDREF( <reference name> );
<reference name>
: Identificatore dichiarato con REFERENCE TO
La variabile booleana è TRUE
quando il riferimento punta a un valore valido. Altrimenti lo è FALSE
.
PROGRAM PLC_PRG VAR iAlfa : INT; riBravo : REFERENCE TO INT; riCharlie : REFERENCE TO INT; bIsRef_Bravo : BOOL := FALSE; bIsRef_Charlie : BOOL := FALSE; END_VAR iAlfa := iAlfa + 1; riBravo REF= iAlfa; riCharlie REF= 0; bIsRef_Bravo := __ISVALIDREF(riBravo); (* becomes TRUE, because riBravo references to iAlfa, which is non-zero *) bIsRef_Charlie := __ISVALIDREF(riCharlie); (* becomes FALSE, because riCharlie is set to 0 *)
Suggerimento
Nella versione del compilatore 3.5.7.40 e successive, la funzione di monitoraggio implicito CheckPointer agisce su variabili di tipo REFERENCE TO
allo stesso modo delle variabili puntatore.